﻿var opts = {
    lines: 12, // The number of lines to draw
    length: 5, // The length of each line
    width: 4, // The line thickness
    radius: 10, // The radius of the inner circle
    corners: 1, // Corner roundness (0..1)
    rotate: 0, // The rotation offset
    direction: 1, // 1: clockwise, -1: counterclockwise
    color: '#000', // #rgb or #rrggbb or array of colors
    speed: 0.5, // Rounds per second
    trail: 60, // Afterglow percentage
    shadow: false, // Whether to render a shadow
    hwaccel: false, // Whether to use hardware acceleration
    className: 'spinner', // The CSS class to assign to the spinner
    zIndex: 2e9, // The z-index (defaults to 2000000000)
    top: 'auto', // Top position relative to parent in px
    left: 'auto' // Left position relative to parent in px
};


function mostrarError(indice, msgError, idDiv) {
    console.log("indice:" + indice + "|msgError:" + msgError + "|idDiv:" + idDiv);
    $('#' + idDiv).empty();
    $("#" + idDiv).append('<div class="alert alert-error"><button type="button" class="close" data-dismiss="alert">×' +
                '</button>'+msgError+'</div>');
}

function mostrarCargando(idDiv) {
    $('#' + idDiv).empty();
    $("#" + idDiv).text("Cargando ...");
}

function showModal(modalContainerId, modalBodyId, id) {
    var url = $(modalContainerId).data('url');
    $.get(url, { id: id }, function (data) {
        $(modalBodyId).html(data);
        $(modalContainerId).modal('show');
    });
}

function log(cadena) {
    //console.log(cadena);
}

function inicializarArregloDibujarChart() {
    arrayFuncionesDibujarChart = [dibujarTreeChart, dibujarPieChart, dibujarColumnChart, dibujarLineChart, dibujarTableChart];
}

function dibujarChart(dataChart, idDiv, funcionHandler, tipoChart, colores) {
    log("dibujarChart :" + tipoChart);
    arrayFuncionesDibujarChart[tipoChart](dataChart, idDiv, funcionHandler,colores);
}

function mostrarTexto(cad, id) {//excluido el #
    var elemento = $("#" + id)
    if (cad.length > 0) {
        elemento.text(cad);
        elemento.css('opacity', '1')
    }
    else {
        elemento.css('opacity', '0')
    }
    
}

var dibujarPieChart = function (datos, idDiv, funcionHandler,colores) {
    var data = datos;
    var piechart = new google.visualization.PieChart(document.getElementById(idDiv))
    function selectHandler() {
        var selectedItem = piechart.getSelection()[0];
        if (selectedItem) {
            var topping = data.getValue(selectedItem.row, 0);
            var otro = data.getValue(selectedItem.row, 1);
            log('PIE The user selected ' + topping + " " + otro);
            funcionHandler(topping, otro, topping);
        }
    }
    if (funcionHandler != null) {
        google.visualization.events.addListener(piechart, 'select', selectHandler);
    }
    piechart.draw(data, {
        backgroundColor: "transparent",
        colors: colores,
        chartArea: { 'width': '80%', 'height': '90%' },
        legend: { 'position': 'right', alignment: 'center', textStyle: { color: 'white' } }
        
    });
}

var dibujarColumnChart = function (datos, idDiv, funcionHandler,colores) {
    function selectHandler() {
        var selectedItem = columnchart.getSelection()[0];
        if (selectedItem) {
            var topping = datos.getValue(selectedItem.row, 0);
            var otro = datos.getValue(selectedItem.row, 1);
            var columna = datos.getColumnLabel(selectedItem.column);
            log('COLUMN The user selected ' + topping + "|" + otro + "|" + columna);
            funcionHandler(topping, otro, columna);
        }
    }
    var columnchart = new google.visualization.ColumnChart(document.getElementById(idDiv));
    if (funcionHandler != null) {
        google.visualization.events.addListener(columnchart, 'select', selectHandler);
    }
    columnchart.draw(datos, {
        chartArea: {  'height': '80%' },
        backgroundColor: "transparent", colors: colores,
        legend: { textStyle: { color: 'white' } },
        hAxis: { hAxis: { textStyle: { color: 'white' } },
        vAxis: { baselineColor:'white',textStyle: { color: 'white' } },textStyle: { color: 'white' } },
        vAxis: { textStyle: { color: 'white' } },
    });
}

var dibujarLineChart = function (datos, idDiv, funcionHandler,colores) {
    function selectHandler() {
        var selectedItem = linechart.getSelection()[0];
        if (selectedItem) {
            var topping = datos.getValue(selectedItem.row, 0);
            var otro = datos.getValue(selectedItem.row, 1);
            var columna = datos.getColumnLabel(selectedItem.column);
            log('LINE The user selected ' + topping + "|" + otro + "|" + columna);
            funcionHandler(topping, otro, columna);
        }
    }
    var linechart = new google.visualization.LineChart(document.getElementById(idDiv));
    if (funcionHandler != null) {
        google.visualization.events.addListener(linechart, 'select', selectHandler);
    }
    linechart.draw(datos, {
        backgroundColor: "transparent",
        chartArea: { 'height': '80%' },
        colors: colores,
        legend: { textStyle: { color: 'white' } },
        hAxis: { textStyle: { color: 'white' } },
        vAxis: { textStyle: { color: 'white' } },
    });

}

var dibujarTableChart = function (datos, idDiv, funcionHandler, colores) {
    //Ignoro los colores
    function selectHandler() {
        var selectedItem = tableChart.getSelection()[0];
        if (selectedItem) {
            var topping = datos.getValue(selectedItem.row, 0);
            var otro = datos.getValue(selectedItem.row, 1);
            log('TABLE The user selected ' + topping + "|" + otro + "|" + topping);
            funcionHandler(topping, otro, topping);
        }
    }
    var cssClassNames = { 'tableCell': 'cell-center' };
    var tableChart = new google.visualization.Table(document.getElementById(idDiv));
    if (funcionHandler != null) {
        google.visualization.events.addListener(tableChart, 'select', selectHandler);
    }
    tableChart.draw(datos, {
        backgroundColor: "transparent", height: tamAltoChart, width: '100%',
        'cssClassNames': cssClassNames
    });
}

var dibujarTreeChart = function (datos, idDiv, funcionHandler,colores) {
    
    funcionHandler[0]();//funcionIniciar();//Diferente significado actualizarNombreHijoTotal
    log("tree padre :" + treePadre + ", tree hijo:" + treeHijo);

    var tdata = datos;

    tree = new google.visualization.TreeMap(document.getElementById(idDiv));

    function selectTreeBackHandler() {
        log("evento Tree back");
        var selectedItem = tree.getSelection()[0];

        //log("evento Tree back-> antes del if");
        if (selectedItem) {
            var a1 = tdata.getValue(selectedItem.row, 0);
            var a2 = tdata.getValue(selectedItem.row, 1);
            var a3 = tdata.getValue(selectedItem.row, 2);
            var a4 = tdata.getValue(selectedItem.row, 3);
            codHijo = tdata.getValue(selectedItem.row, 4);
            codPadre = tdata.getValue(selectedItem.row, 5);
            treeHijo = a1;
            treePadre = a2;
            log("evento Tree back-> No es un nodo hijo: hijo:" + a1 + "|padre:" + a2 + "|size:" + a3 + "|color:" + a4 +
                "|codHijo:"+codHijo+"|codPadre"+codPadre);

            if (funcionHandler[2] !=null) funcionHandler[2]();//funcionBackHandler();
            funcionHandler[0]();//actualizarNombreHijoTotal();

            log("Actualizado tree padre :" + treePadre + ", tree hijo:" + treeHijo);

        }

    }
    function selectTreeHandler() {
        log("evento Tree Select");
        var selectedItem = tree.getSelection()[0];
        if (selectedItem) {
            var a1 = tdata.getValue(selectedItem.row, 0);
            var a2 = tdata.getValue(selectedItem.row, 1);
            var a3 = tdata.getValue(selectedItem.row, 2);
            var a4 = tdata.getValue(selectedItem.row, 3);
            codHijo = tdata.getValue(selectedItem.row, 4);
            codPadre = tdata.getValue(selectedItem.row, 5);
            //treeHijo = a1;
            //treePadre = a2;

            if (funcionHandler[1] != null)  funcionHandler[1](a1,a2,a3);//funcionSelectHandler(a3);
            log("evento Tree -> Nodo : hijo:" + a1 + "|padre:" + a2 + "|size:" + a3 + "|color:" + a4+
                "|codHijo:"+codHijo+"|codPadre"+codPadre);
            log("Actualizado tree padre :" + treePadre + ", tree hijo:" + treeHijo);
            funcionHandler[0](); //funcionIniciar();
        }

    }
    function treeMouseOver(e) {
        var row = e.row;
        funcionHandler[3](tdata.getValue(row, 0), tdata.getValue(row, 1), tdata.getValue(row, 2), tdata.getValue(row, 3));
    }
    function treeMouseOut(e) {        
        funcionHandler[4]( );
    }


    google.visualization.events.addListener(tree, 'select', selectTreeHandler);
    google.visualization.events.addListener(tree, 'rollup', selectTreeBackHandler);
    google.visualization.events.addListener(tree, 'onmouseover', treeMouseOver);
    google.visualization.events.addListener(tree, 'onmouseout', treeMouseOut);

    if (colores == null) {
        tree.draw(tdata, {
            minColor: 'red',
            midColor: '#ddd',
            maxColor: '#0d0',
            headerHeight: 15,
            fontColor: 'black',
            showScale: true,
            showTooltips: false,
            maxColorValue: 200,
            minColorValue: -200,
            backgroundColor: "transparent"

        });
    }
    else {
        tree.draw(tdata, {
            minColor: colores[0],
            midColor: colores[1],
            maxColor: colores[2],
            headerHeight: 15,
            fontColor: 'black',
            showScale: true,
            showTooltips: false,
            maxColorValue: 200,
            minColorValue: -200,
            backgroundColor: "transparent"

        });
    }
}

function transformarData(data) {
    var rows = data.length - 2;
    var cols = data[0].length;
    var tdata = new google.visualization.DataTable();
    log("creado tdata");
    for (var i = 0; i < cols; i++) {
        tdata.addColumn(data[0][i], data[1][i]);
    }
    tdata.addRows(rows);
    for (var i = 2; i < data.length; i++) {

        for (var j = 0; j < cols; j++) {
            var value = data[i][j];
            if (data[0][j] == 'number') {
                
                if (value.indexOf(".") == -1 && value.indexOf(",") == -1)
                {
                    
                    value = parseInt(data[i][j]);
                }
                else {
                    console.log("DECIMAL " + data[i][j]);
                    value = parseFloat(data[i][j]);
                }
            }
            tdata.setCell(i - 2, j, value);
        }
    }
    return tdata;
}

function ObjetoTree( nivelInicial , nivelFinal ) {
    this._nivelInicial = nivelInicial;
    this._nivelFinal = nivelFinal;
    this._nivelActual = nivelInicial;
    this.bajarNivel = function () {
        if (this._nivelActual > this._nivelFinal) {
            this._nivelActual = this._nivelActual - 1;
        }
    }
    this.bajarNivelDIR = function () {
        this._nivelActual = this._nivelFinal - 1;
    }
    this.subirNivel = function () {
        if (this._nivelActual < this._nivelInicial) {
            this._nivelActual = this._nivelActual + 1;
        }
    }
    this.subir2Niveles = function () {
        if (this._nivelActual < this._nivelFinal) {
            this._nivelActual = this._nivelFinal;
        }
        if (this._nivelActual + 1 < this._nivelInicial) {
            this._nivelActual = this._nivelActual + 2;
        }
        else {
            this.subirNivel();
        }
    }
    this.getNivel = function () {
        return this._nivelActual;
    }
    this.iniciar = function () {
        this._nivelActual = this._nivelInicial;
    }
}

function cargando(indice) {
    infoModulo[indice].spinStart();
}
function finCargando(indice) {
    infoModulo[indice].spinStop();
}

function InfoModulo(divChart, actualizaFuncion, data, tipoChart, modulo, colores) {
    this._divChart = divChart;
    this._actualizaFuncion = actualizaFuncion;
    this._data = data;
    this._tipoChart = tipoChart;
    this._tipoTxNivel1 = null;
    this._tipoTxNivel2 = null;
    this._estadoTx = null;
    this._modulo = modulo;
    this._colores = colores;
    this._motivoNoOperativo = null;
    this._tiempoSinTx = null;
    this._spiner = null;
    
    this.spinStart = function () {
        var target = document.getElementById(this._divChart);
        $('#' + this._divChart).empty();
        this._spiner = new Spinner(opts).spin(target);
    }
    this.spinStop = function () {
        this._spiner.stop();
    }
    this.getDivChart = function () {
        return this._divChart;
    }
    this.getActualizaFuncion = function () {
        return this._actualizaFuncion;
    }
    this.getData = function () {
        return this._data;
    }
    this.setData = function (datos) {
        this._data = datos;
    }
    this.getTipoChart = function () {
        return this._tipoChart;
    }
    this.setTipoChart = function (tipochart) {
        this._tipoChart = tipochart;
    }
    this.setTipoTxNivel1 = function (tipoTx) {
        this._tipoTxNivel1 = tipoTx;
        mostrarBotonSeleccion(1, this._modulo, tipoTx);
    }
    this.getTipoTxNivel1 = function () {
        return this._tipoTxNivel1;
    }
    this.setTipoTxNivel2 = function (tipoTx) {
        this._tipoTxNivel2 = tipoTx;
        mostrarBotonSeleccion(2, this._modulo, tipoTx);
    }
    this.getTipoTxNivel2 = function () {
        return this._tipoTxNivel2;
    }
    this.setEstadoTx = function (estadoTx) {
        this._estadoTx = estadoTx;
        mostrarBotonSeleccion(3, this._modulo, estadoTx);
    }
    this.getEstadoTx = function () {
        return this._estadoTx;
    }
    this.getColores = function () {
        return this._colores;
    }
    this.limpiarSelecciones = function () {
        this.limpiarSeleccion(1);
        this.limpiarSeleccion(3);
    }
    this.limpiarSeleccion = function (pos) {
        log("limpiar pos" + pos);
        esconderBotonSeleccion(pos, this._modulo);
        if (pos == 1 || pos == 2) {
            this._tipoTxNivel2 = null;
            if (pos == 1) {
                nivelTipoTx = 1;
                esconderBotonSeleccion(2, this._modulo);
                this._tipoTxNivel1 = null;
            }
        }
        else {
            this._estadoTx = null;
        }
    }
    this.limpiarSeleccionPanelControl = function (pos) {
        esconderBotonSeleccion(pos, this._modulo);
        if (pos == 1) {
            this._motivoNoOperativo = null;
        }
        else {
            this._tiempoSinTx = null;
        }
    }
    this.limpiarSeleccionesPanelControl = function () {
        this.limpiarSeleccionPanelControl(1);
        this.limpiarSeleccionPanelControl(2);
    }
    this.setMotivoNoOperativo = function (motivoNoOperativo) {
        this._motivoNoOperativo = motivoNoOperativo;
        mostrarBotonSeleccion(1, this._modulo, this._motivoNoOperativo);
    }
    this.getMotivoNoOperativo = function () { 
        return this._motivoNoOperativo;
    }
    this.setTiempoSinTx = function (tiempoSinTx) {
        this._tiempoSinTx = tiempoSinTx;
        mostrarBotonSeleccion(2, this._modulo, this._tiempoSinTx);
    }
    this.getTiempoSinTx = function () {
        return this._tiempoSinTx;
    }
}